/**
 * 第二版，超长上下文分析，不必识别文件用途和OCR
 */
import { getContext } from './context.js';
import { verify } from './baseInfo.js';
import { showToast } from './toast.js';

export async function analyze() {
    console.log('开始分析');
    const verifyBaseInfoErrMsg = verify();
    if (typeof verifyBaseInfoErrMsg === 'string') {
        showToast('请先录入基本信息');
        return;
    }
    const context = getContext();
    context.isOperating = true;
    const analyzeStartTime = Date.now();
    console.log('开始分析时间：' + analyzeStartTime);
    const formData = new FormData();
    const fileList = context.fileList;
    console.log('文件列表：', fileList);
    formData.append('fileList', JSON.stringify(fileList));
    const censorType = context.censorType;
    const censorOption = context.censorTypeOptions.find(
        (option) => option.censorType == censorType
    );
    if (!censorOption) {
        throw new Error('当前未选择预检目录');
    }
    const censorList = censorOption.censorList;
    let prompt = `你好，我是政府的办公人员，当前即将有一场演出，附件是演出相关的内容，
        请帮我完整提取所有附件的文本，理解每个附件的作用，
        据附件内容为上下文，并回答以下问题：\n`;
    prompt += censorList
        .map((question, index) => `${index + 1}. ${question}`)
        .join('\n');
    prompt += '\n';
    prompt += '工作流程如下：\n';
    prompt +=
        '1. 读取附件的内容，并识别附件的作用，例如：“演员列表”附件一般包含大量的证件\n';
    prompt +=
        '2. 列出相关内容，例如：判断证件是否过期，则需要列出所有证件的姓名、有效日期等关键内容\n';
    prompt +=
        '3. 交叉验证，例如：未成年人证件是在一个独立附件里，监护人同意书也在一个独立文件里，但它们是相关联的，基于姓名或ID联系起来，交叉判断是否符合要求\n';
    prompt += '结果请按以下规则返回：\n';
    prompt += '1. 所有内容均以html格式返回，不要body及以外的dom标签\n';
    prompt += '2. 高亮显示结果\n';
    prompt += '3. 结果以问题为标题(h3)，结果为内容的方式显示(div)\n';
    prompt += '4. 涉及附件名称的，请显示实际文件名，不要使用文件ID和哈希值\n';
    prompt += '以下是附加提示信息：\n';
    prompt += '1. 当前时间是：' + Date().toString() + '\n';
    prompt += '2. 演员身份证件信息一般在包含大量的身份证件的附件里\n';
    prompt += '3. 监护人同意书里有未成年演员和监护人的信息\n';
    prompt += '4. 不要列出与附件无关的信息\n';
    // 额外的提示词
    prompt += censorOption.prompt;
    formData.append('prompt', prompt);
    let response;
    try {
        response = await fetch('/analyze', {
            method: 'post',
            body: formData,
        });
    } catch (error) {
        context.isOperating = false;
        showToast('请求AI大模型失败');
        throw new Error('请求失败');
    }
    let total = '';
    const decoder = new TextDecoder();
    for await (const chunk of response.body) {
        const decodeValue = decoder.decode(chunk);
        total += decodeValue;
        censorOption.censorReport = total;
    }
    context.isOperating = false;
    const analyzeEndTime = Date.now();
    console.log('结束分析时间：' + analyzeStartTime);
    const analyzeDuration = (analyzeEndTime - analyzeStartTime) / 1000;
    console.log('AI分析总耗时：' + analyzeDuration + '秒');
    showToast('调用AI大模型结束');
}
